package ar.edu.utn.frgp.labtec.dao;

import java.util.HashMap;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import ar.edu.utn.frgp.labtec.constants.DBParametersConstants;
import ar.edu.utn.frgp.labtec.entities.EstadoEnum;
import ar.edu.utn.frgp.labtec.entities.OrdenDeTrabajo;

public class OrdenTrabajoDao extends DefaultGenericDao implements GenericDao<OrdenDeTrabajo> {


	public void create(OrdenDeTrabajo obj) {
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		obj.setEstado(EstadoEnum.H);
		session.save(obj);
	}
	

	public void update(OrdenDeTrabajo obj) {
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		session.update(obj);
	}


	public void delete(OrdenDeTrabajo obj) {
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		obj.setEstado(EstadoEnum.I);
		session.update(obj);
	}
	
	public void restore(OrdenDeTrabajo obj) {
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		obj.setEstado(EstadoEnum.H);
		session.update(obj);
	}

	@SuppressWarnings("unchecked")
	public List<OrdenDeTrabajo> getAll() {
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		List<OrdenDeTrabajo> resultList = (List<OrdenDeTrabajo>)session.createCriteria(OrdenDeTrabajo.class).list();
		
		return resultList;
	}
	
	public OrdenDeTrabajo getOrdenTrabajo(Integer idOrden){
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		
		Criteria criteria = session.createCriteria(OrdenDeTrabajo.class);
		criteria.add(Restrictions.eq(DBParametersConstants.ID_ORDEN, idOrden));
		
		OrdenDeTrabajo result = (OrdenDeTrabajo)criteria.uniqueResult();
		
		return result;
	}
	
	public Integer getNumeroDeOrden(){
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		Integer result = null;
		
		Criteria criteria = session.createCriteria(OrdenDeTrabajo.class);
		criteria.setProjection(Projections.max(DBParametersConstants.ID_ORDEN));
		
		result = (Integer)criteria.uniqueResult();
		
		if(result == null)
			result = 0;
		
		return result;
	}
	
	@SuppressWarnings("unchecked")
	public List<OrdenDeTrabajo> getOrdenes(HashMap<String, Object> parameters){
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		
		List<OrdenDeTrabajo> resultList = null;
		
		Criteria criteria = session.createCriteria(OrdenDeTrabajo.class);
		
		for(String key : parameters.keySet()){
			criteria.add(Restrictions.eq(key, parameters.get(key)));
		}
		try {
			resultList = (List<OrdenDeTrabajo>)criteria.list();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		return resultList;
	}
	
	public Boolean exists(Integer idOrden){
		Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
		
		Criteria criteria = session.createCriteria(OrdenDeTrabajo.class);
		criteria.add(Restrictions.eq(DBParametersConstants.ID_ORDEN, idOrden));
		criteria.setProjection(Projections.count(DBParametersConstants.ID_ORDEN));
		
		Long result = (Long)criteria.uniqueResult();
		if(result != null && result > 0)
			return true;
		else
			return false;
	}


}
